package col

import (
	tableConsts "yunj/pkg/yunj/core/builder/builderconsts"
	"yunj/pkg/yunj/core/builder/table"
)

// 自定义
type Custom struct {
	table.Col
	Html            string                            `json:"html"`
	HtmlFunc        func(col *Custom) (string, error) `json:"-"` // 返回自定义的html和错误
	ExportValueFunc func(value any) any               `json:"-"` // 导出时，自定义返回值
}

func NewCustom(field string, title ...string) *Custom {
	c := &Custom{}
	// 设置默认值
	c.Type = tableConsts.TABLE_COL_TYPE_NORMAL

	table.SetColInstance(&c.Col, c)
	c.SetColField(field)
	if len(title) > 0 {
		c.SetTitle(title[0])
	}
	return c
}

// 设置标题
func (c *Custom) SetTitle(title string) *Custom {
	c.Title = title
	return c
}

// 设置排列方式
func (c *Custom) SetAlign(align string) *Custom {
	c.Align = align
	return c
}

// 设置是否开启列的排序功能
func (c *Custom) SetSort(yes bool) *Custom {
	c.Sort = yes
	return c
}

// 设置固定列
func (c *Custom) SetFixed(fixed string) *Custom {
	c.Fixed = fixed
	return c
}

// 设置隐藏列
func (c *Custom) SetHide(hide string) *Custom {
	c.Hide = hide
	return c
}

// 设置权限
func (c *Custom) SetAuth(auth string) *Custom {
	c.Auth = auth
	return c
}

// 设置宽度
func (c *Custom) SetWidth(width any) *Custom {
	c.Width = width
	return c
}

// 设置最小宽度
func (c *Custom) SetMinWidth(minWidth uint64) *Custom {
	c.MinWidth = minWidth
	return c
}

// 设置最大宽度
func (c *Custom) SetMaxWidth(maxWidth uint64) *Custom {
	c.MaxWidth = maxWidth
	return c
}

// 设置自定义的html
func (c *Custom) SetHtml(html string) *Custom {
	c.Html = html
	return c
}

// 设置返回自定义的html和错误的回调方法
func (c *Custom) SetHtmlFunc(fun func(col *Custom) (string, error)) *Custom {
	c.HtmlFunc = fun
	return c
}

// 设置导出时，自定义返回值的回调方法
func (c *Custom) SetExportValueFunc(fun func(value any) any) *Custom {
	c.ExportValueFunc = fun
	return c
}

// 处理属性
func (c *Custom) HandleAttr() error {
	if c.Html == "" && c.HtmlFunc != nil {
		html, err := c.HtmlFunc(c)
		if err != nil {
			return c.SetError(err)
		}
		c.Html = html
	}
	return nil
}

// 获取导出值
func (c *Custom) GetExportValue(value any) any {
	if c.ExportValueFunc != nil {
		return c.ExportValueFunc(value)
	}
	return value
}
